逐次処理からの脱出③ マルチスレッドとマルチプロセス
先に言っておくと...
「マルチスレッド」も「マルチプロセス」も並列処理・並行処理をするための手段
マルチスレッド
1つのプロセスで複数のスレッドを用意して並列/並行処理を行う方法
table:
メリット
メモリ使用率が低くなる
スレッド間でデータをやり取りするのが簡単
スレッドの生成はプロセスの生成よりも速くできる(新しくメモリの確保が必要ないから)
デメリット
1つのスレッドが落ちるとプロセス全体が落ちる
データの不整合・デッドロックなど予期せぬバグが起こりやすい
そうならないようにプログラミングするのは中々難しい。スキルが必要になる。
マルチプロセス
複数のプロセスを用意して並列/並行処理を行う方法
table:
メリット
1つのプロセスが落ちても、他のプロセスには影響しない
データの不整合などを気にしなくていい
デメリット
メモリの消費率が高い(プロセスコピーするごとに元プロセスと同じ容量のメモリを確保される)
スレッドと違って、プロセス間でデータ共有するのが手間(= プロセス間通信) コンテキストスイッチに要する時間が長い
ちなみに親プロセスからコピー(子プロセス)を生み出すことをフォークという 並列処理の文脈においてのマルチスレッド、マルチプロセス
基本的にはマルチスレッドを採用しておけば、処理速度はより速くなるかなと思ってる(コンテキストスイッチの関係)
ただし、データの不整合・排他ロックが起こる可能性が高まる場合には、マルチプロセスを採用すればいい
また、pythonのように1スレッドしか動かせないていうような制約がある場合も、マルチプロセスを採用する
カーネルモードと頻繁に切り替わるとか、他アプリケーションが動いてるとかない限りは、そこまでコンテキストスイッチが負に働くことはないと思われる
並行処理の文脈においてのマルチスレッド、マルチプロセス
これもスレッドを採用しておけばいい
コアが1つしかない場合、マルチスレッドの方が速く実行切り替えができる
「マルチスレッド」優位で考えてるが...
「マルチスレッドは難しい、大人しくマルチプロセスにしとけ」的な考え方が業界にあるような気がしている
その理由をまだ掴めてないので、自分自身マルチスレッド優位の考え方に対して自信を持ってるわけではない
参考